package com.heima.user.service.Impl;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.user.dtos.LoginDto;
import com.heima.model.user.pojos.ApUser;
import com.heima.user.mapper.ApUserMapper;
import com.heima.user.service.ApUserService;
import com.heima.utils.common.AppJwtUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;

import java.util.HashMap;
import java.util.Map;


@Service
@Transactional//事务
@Slf4j
public class ApUserServiceImpl extends ServiceImpl<ApUserMapper, ApUser> implements ApUserService {

    //用户登录，游客登录：
    //手机号，密码为空 为游客登陆， 游客登陆返回 一个 id：0 的jwt 的token
    @Override
    public ResponseResult login(LoginDto loginDto) {
        //1:正常登录：
        //1.1:判断：传过来的 phone 和 password 是否为空 ：
        //StringUtils: lang3 中的 StringUtils
        if (StringUtils.isNotEmpty(loginDto.getPhone()) && StringUtils.isNotEmpty(loginDto.getPassword())) {
            //1.2： phone 和 password 不为空：
            //根据 phone 查询 ap_user表
            ApUser apUser = getOne(Wrappers.<ApUser>lambdaQuery().eq(ApUser::getPhone, loginDto.getPhone()));

            if (apUser == null) {
                //查询不到，返回：用户名不存在
                return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST, "用户名不存在");
                //自定义：返回的msg
            }

            //查询到 ： 获取对应的盐字段的值，并且：将传来的password与盐拼接，MD5加密后与数据库重的 password比对
            String md5Password = DigestUtils.md5DigestAsHex((loginDto.getPassword() + apUser.getSalt()).getBytes());

            if (apUser.getPassword().equals(md5Password)) {
                //密码匹配：使用JWT工具类：生成token， 返回用户信息和token 并封装进 Map
                String token = AppJwtUtil.getToken(Long.valueOf(apUser.getId()));
                Map result = new HashMap<>();
                result.put("token", token);
                //User封装：方法一：将 salt 和 password 设置为 null
                //apUser.setSalt(null);
                //apUser.setPassword(null);
                //result.put("user",apUser);
                //方法二： map 套 map
                Map userMap = new HashMap();
                userMap.put("id", apUser.getId());
                userMap.put("name", apUser.getName());
                userMap.put("phone", apUser.getPhone());
                result.put("user", userMap);

                return ResponseResult.okResult(result);
            }
            //匹配失败：返回：密码错误：
            return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);

        } else {
            //2：游客登陆：
            //用户ID为 0 生成 token 返回
            String token = AppJwtUtil.getToken(0L);
            Map result = new HashMap();
            result.put("token", token);
            return ResponseResult.okResult(result);
        }

        //课堂训练第二遍：
/*        //判断是普通登录还是游客登陆
        //由手机号码和密码：铍铜登录：
        if (StringUtils.isNotEmpty(loginDto.getPhone())&&StringUtils.isNotEmpty(loginDto.getPassword())){
            //判断：手机号（用户名）是否存在
            ApUser apUser = getOne(Wrappers.<ApUser>lambdaQuery().eq(ApUser::getPhone, loginDto.getPhone()));
            if (apUser == null){
                //手机号不存在，返回对应信息
                return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST,"手机号不存在");
            }
            //手机号存在：开始比对密码是否正确：
            String md5Password = DigestUtils.md5DigestAsHex((loginDto.getPassword() + apUser.getSalt()).getBytes());

            if (md5Password.equals(apUser.getPassword())){
                //密码比对成功：开始获取Jwt令牌：并封装返回给前端：
                String token = AppJwtUtil.getToken(Long.valueOf(apUser.getId()));
                Map result = new HashMap();
                //User采用Map封装需要的参数
                Map user = new HashMap();
                user.put("id",apUser.getId());
                user.put("name",apUser.getName());
                user.put("phone",apUser.getPhone());
                //封装：
                result.put("user",user);
                result.put("token",token);
                //返回：
                return ResponseResult.okResult(result);
            }
            //密码比对不成功：
            return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);
        }
        else {
            //游客登录：
            //使用id为0获取token
            String token = AppJwtUtil.getToken(0L);
            return ResponseResult.okResult(token);
        }*/
    }

}
